#include <bits/stdc++.h>

int const MAXCOUNT = 9999;

// 硬币找零问题，（动态规划算法，自底向上求解）
int change(int *coinValues, int coinKinds, int n) {
  // 申请二维数组 c[coinKinds+1][n+1]
  int **c = (int **)malloc(sizeof(int *) * (coinKinds + 1));
  for (int i = 0; i <= coinKinds; i++) {
    c[i] = (int *)malloc(sizeof(int) * (n + 1));
  }

  // 0. 初始化，c[i,j]表示使用i种硬币找零金额j需要的硬币数量
  // 0.1 先对硬币进行排序，coinValues[] 下标从1开始
  std::sort(coinValues + 1, coinValues + 1 + coinKinds);
  // 0.2 找零0元需要0枚硬币
  for (int i = 0; i <= coinKinds; i++) {
    c[i][0] = 0;
  }
  // 0.3 假设0枚硬币找零任意金额需要无限枚硬币
  for (int j = 0; j <= n; j++) {
    c[0][j] = MAXCOUNT;
  }

  for (int j = 1; j <= n; j++) {
    for (int i = 1; i <= coinKinds; i++) {
      // 特殊情况：当前硬币面值大于待找零金额，不能使用当前硬币找零
      if (coinValues[i] > j) {
        c[i][j] = c[i - 1][j];
        continue;
      }
      // 状态转移
      if (c[i - 1][j] < c[i][(j - coinValues[i])] + 1) {
        c[i][j] = c[i - 1][j];
      } else {
        c[i][j] = c[i][(j - coinValues[i])] + 1;
      }
    }
  }
  return c[coinKinds][n];
}

int main() {
  int m, n;
  while (scanf("%d", &m) == 1 && m > 0) {
    int *coinValues = (int *)malloc(sizeof(int) * (m + 1));
    for (int i = 1; i <= m; i++) {
      scanf("%d", &coinValues[i]);
    }
    scanf("%d", &n);
    int count;
    count = change(coinValues, m, n);
    if (count != MAXCOUNT) {
      printf("%d\n", count);
    } else {
      printf("Impossible\n");
    }
  }
  return 0;
}